/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Pojo.Aluno;
import Pojo.Disciplina;
import Pojo.HistoricoTurma;
import Pojo.Turma;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author Ronan Lopes
 */
public class HistoricoTurmaDaoImplJPA implements HistoricoTurmaDao{
         /**
	 * Adicionar um HistoricoTurma ao banco de dados de HistoricoTurma
	 * @param historicoturma
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean inserir(HistoricoTurma historicoturma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.persist(historicoturma);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * Remover HistoricoTurma do banco de dados de HistoricoTurma
	 * @param historicoturma
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean remover(HistoricoTurma historicoturma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                HistoricoTurma historicoTurmaAux = em.find(HistoricoTurma.class,historicoturma.getId());
                em.remove(historicoTurmaAux);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * alterar HistoricoTurma do banco de dados de HistoricoTurma
	 * @param historicoturma
	 * @return true ou false indicando sucesso ou não
	 */
         public boolean alterar(HistoricoTurma historicoturma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.merge(historicoturma);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
         }
         
        /**
	 * Verificação da existência de um históricoTurma pesquisando por um aluno e uma turma
	 * @param idAluno
	 * @param idTurma
	 * @return inteiro que referência o código do históricoTurma encontrado. Se não foi encontrado retorna a flag -1 
	 */
	public int verificarAlunoCadastradoTurma(Aluno aluno, Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<HistoricoTurma> listaHistoricoTurma = null;
            try{
                tx.begin();
                Query query = em.createQuery("select h from HistoricoTurma h where h.aluno = :aluno and h.turma = :turma");
                query.setParameter("aluno", aluno);
                query.setParameter("turma", turma);
                listaHistoricoTurma = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(0);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            
            if (listaHistoricoTurma.isEmpty()){
                return(0);
            }else{
                return(1);
            }
        }
        
        	/**
	 * Pesquisa de Alunos passando a turma
	 * @param turma
	 * @return Lista de Alunos cujo historicoTurma pertence à turma
	 */
	public List<Aluno> pesquisarAlunosTurma(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Aluno> listaAlunos = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Aluno a join a.historicoTurmas h where h.turma= :turma");
                query.setParameter("turma", turma);
                listaAlunos = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAlunos);
        }
        
        /**
	 * Método que buscar o historicoTurma passando um aluno e uma turma
	 * @param aluno
	 * @param turma
	 * @return HistoricoTurma ou null se não encontrar
	 */
	public HistoricoTurma pesquisarPorAlunoETurma(Aluno aluno, Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            HistoricoTurma historicoTurma = null;
            try{
                tx.begin();
                Query query = em.createQuery("select h from HistoricoTurma h where h.aluno = :aluno and h.turma = :turma");
                query.setParameter("aluno", aluno);
                query.setParameter("turma", turma);
                historicoTurma = (HistoricoTurma) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(historicoTurma);
        }
        
        public List<HistoricoTurma> pesquisarPorAluno(Aluno aluno){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<HistoricoTurma> listaHistoricoTurma = null;
            try{
                tx.begin();
                Query query = em.createQuery("select h from HistoricoTurma h where h.aluno = :aluno");
                query.setParameter("aluno", aluno);
                listaHistoricoTurma = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaHistoricoTurma);
        }
        
        /**
	 * Método que pesquisa históricosTurmas passando uma turma passada por parâmetro
	 * @param turma
	 * @return Lista de HistoricoTurma
	 */
	public List<HistoricoTurma> pesquisarPorTurma(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<HistoricoTurma> listaHistoricoTurma = null;
            try{
                tx.begin();
                Query query = em.createQuery("select h from HistoricoTurma h where h.turma = :turma");
                query.setParameter("turma", turma);
                listaHistoricoTurma = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaHistoricoTurma);
        }
        
}
